home *** CD-ROM | disk | FTP | other *** search
- /*
- ** A Pratt-Boyer-Moore string search, written by Jerry Coffin
- ** sometime or other in 1991. Removed from original program, and
- ** (incorrectly) rewritten for seperate, generic use in early 1992.
- ** Corrected with help from Thad Smith, late March and early
- ** April 1992...hopefully it's correct this time. Revised by Bob Stout.
- **
- ** This is hereby placed in the Public Domain by its author.
- */
-
- #include <stddef.h>
- #include <string.h>
- #include <limits.h>
-
- static size_t table[UCHAR_MAX];
- static size_t len;
- static char *findme;
-
- /*
- ** Call this with the string to locate to initialize the table
- */
-
- void init_search(const char *string)
- {
- size_t i;
-
- len = strlen(string);
- for (i = 0; i < UCHAR_MAX; i++)
- table[i] = len;
- for (i = 0; i < len; i++)
- table[(unsigned char)string[i]] = len - i - 1;
- findme = (char *)string;
- }
-
- /*
- ** Call this with a buffer to search
- */
-
- char *strsearch(const char *string)
- {
- register size_t shift;
- register size_t pos = len - 1;
- char *here;
- size_t limit=strlen(string);
-
- while (pos < limit)
- {
- while( pos < limit &&
- (shift = table[(unsigned char)string[pos]]) > 0)
- {
- pos += shift;
- }
- if (0 == shift)
- {
- if (0 == strncmp(findme,
- here = (char *)&string[pos-len+1], len))
- {
- return(here);
- }
- else pos++;
- }
- }
- return NULL;
- }
-
- #ifdef TEST
-
- #include <stdio.h>
-
- void main(void)
- {
- char *here;
- char *find_strings[] = {"abb", "you", "not", "it", "dad", "yoo", "hoo",
- "oo", "oh", "xx", "xx", "x", "x", NULL};
- char *search_strings[] = {"cabbie", "your", "It isn't here",
- "But it is here", "hodad", "yoohoo", "yoohoo",
- "yoohoo", "yoohoo", "yoohoo", "xx", "x", "."};
- int i;
-
- for (i = 0; find_strings[i]; i++)
- {
- init_search(find_strings[i]);
- here = strsearch(search_strings[i]);
- printf("\"%s\" is%s in \"%s\"", find_strings[i],
- here ? "" : " not", search_strings[i]);
- if (here)
- printf(" [\"%s\"]", here);
- putchar('\n');
- }
-
- }
-
- #endif
-